iT邦幫忙

2024 iThome 鐵人賽

DAY 26
0
Mobile Development

當Java遇見Android,30天學習指南系列 第 26

# Day 26 簡單介紹 Fragment + Viewpager

  • 分享至 

  • xImage
  •  

Fragment 和 ViewPager2 常用於實現頁面之間的切換,特別是在應用中需要橫向滑動展示多個頁面時,這種組合非常常見。
每個頁面可以作為一個獨立的 Fragment,而 ViewPager2 負責處理頁面的切換,為用戶提供順暢的滑動效果。透過這種結合方式,可以輕鬆實現多頁面的動態切換,並保持頁面間的流暢過渡。

介紹ViewPager主要特點:
1.他可以水平和垂直方向的滑動。
2.也可以左右滑動,也支援頁面間的滑動效果

上一篇有教怎麼建立Fragment的布局,這篇就不再介紹,還有不懂怎麼立Fragment的布局,可以去看上一篇。

利用簡單的範例:

https://ithelp.ithome.com.tw/upload/images/20241004/20168805X6Q1GtjUOC.png

製作農產品的選單
首先,一樣先拉介面,我會跟上篇一樣先把Fragment.xml商品的布局介面拉好,再會到activity_main.xml做連接二個Fragment的button的布局和ViewPager的布局。
Fragment1.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Fragment1">


    <TextView
        android:id="@+id/tv_fragment_1"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textSize="40sp"
        android:text="主要銷售水果" 
        android:gravity="center"/>

</FrameLayout>

https://ithelp.ithome.com.tw/upload/images/20241004/20168805LLehH50c9Q.png

Fragment2.xml

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".Fragment2">


    <TextView
        android:id="@+id/tv_fragment_2"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:textSize="40sp"
        android:text="主要銷售蔬菜"
        android:gravity="center"/>

</FrameLayout>

https://ithelp.ithome.com.tw/upload/images/20241004/201688052c7bx4Okef.png

activity_main.xml

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">


    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:orientation="horizontal">

        <Button
            android:id="@+id/fragment_1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="水果" />

        <Button
            android:id="@+id/fragment_2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:text="蔬菜" />

    </LinearLayout>

    <androidx.viewpager2.widget.ViewPager2
        android:id="@+id/viewPager"
        android:layout_width="match_parent"     
        android:layout_height="match_parent"/>
        
        //viewpager2連接Fragment的布局介面,讓整個介面顯示滑動的效果
</LinearLayout>

紅色 ->指的綠框就是viewpager2的布局介面
image

布局介面都設置完後,開始連接程式碼,讓製作的農產品選單呈現你滑動的效果
Fragment1.Java

public class Fragment1 extends Fragment {
    private TextView textView1;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_1, container, false);
    }
    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState){
        super.onViewCreated(view,savedInstanceState);
        textView1 = view.findViewById(R.id.tv_fragment_1);
        textView1.setText("水果專區");
    }
}

Fragment2.Java

public class Fragment2 extends Fragment {
    private TextView textView2;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_2, container, false);
    }
    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState){
        super.onViewCreated(view,savedInstanceState);
        textView2 = view.findViewById(R.id.tv_fragment_2);
        textView2.setText("蔬菜專區");
    }
}

MainActivity.Java

public class MainActivity extends AppCompatActivity {
    private Button button1,button2;    
    private ViewPager2 viewPager;
    
    // 宣告兩個按鈕變數一個 ViewPager2 物件

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        
        // 綁定按鈕和 ViewPager2,並連接至相對應的元件
        button1 = findViewById(R.id.fragment_1);
        button2 = findViewById(R.id.fragment_2);
        viewPager = findViewById(R.id.viewPager);
        
         // 設置 ViewPager ,負責管理 Fragment 切換
        ViewPagerAdapter adapter = new ViewPagerAdapter(this);
        viewPager.setAdapter(adapter);
        viewPager.setCurrentItem(0); // 預設顯示的頁面Fragment1
        
        
        //增加點擊事件,當按下 button1或button2 時,則顯示對應的介面
        button1.setOnClickListener(view -> viewPager.setCurrentItem(0));
        button2.setOnClickListener(view -> viewPager.setCurrentItem(1));

    }
    
    定義 ViewPager ,用來管理不同位置的 Fragment
    
    public static class ViewPagerAdapter extends FragmentStateAdapter {
        public ViewPagerAdapter(FragmentActivity fragmentActivity) {
            super(fragmentActivity);
        }
        @Override
        @NonNull
        public Fragment createFragment(int position) {
            switch (position) {
                case 0:
                    return new Fragment1();
                case 1:
                    return new Fragment2();
                default:
                    return null;
            }
        }
        @Override
        public int getItemCount() {
            return 2;
        }
    }
}

顯示成果:

簡單介紹 Fragment + Viewpager2介紹完畢
下一篇介紹 天氣API(上)


上一篇
# Day25 簡單介紹 Fragment
下一篇
# Day 27 天氣API(上)
系列文
當Java遇見Android,30天學習指南30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言